package com.authine.cloudpivot.web.api.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * 日期工具类
 *
 */
public class DateUtil {

	private static final String NULLSTR = "null";

	/**
	 * 时间戳转换成日期格式字符串
	 *
	 * @param seconds
	 *            精确到秒的字符串
	 * @param format
	 * @return
	 */
	public static String timeStamp2Date(String seconds, String format) {
		if (seconds == null || seconds.isEmpty() || NULLSTR.equals(seconds)) {
			return "";
		}
		if (format == null || format.isEmpty()) {
			format = "yyyy-MM-dd HH:mm:ss";
		}
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		return sdf.format(new Date(Long.valueOf(seconds + "000")));
	}

	/**
	 * 日期格式字符串转换成时间戳
	 *
	 * @param dateStr
	 * @param format
	 * @return
	 */
	public static String date2TimeStamp(String dateStr, String format) {
		if (format == null || format.isEmpty()) {
			format = "yyyy-MM-dd HH:mm:ss";
		}
		try {
			SimpleDateFormat sdf = new SimpleDateFormat(format);
			return String.valueOf(sdf.parse(dateStr).getTime() / 1000);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
	}

	/**
	 * 取得当前时间戳（精确到秒）
	 *
	 * @return
	 */
	public static String getCurrentTimeStamp() {
		long time = System.currentTimeMillis();
		String t = String.valueOf(time / 1000);
		return t;
	}

	/**
	 * 取得当前时间字符串
	 *
	 * @param format
	 * @return
	 */
	public static String getCurrentDate(String format) {
		if (format == null || format.isEmpty()) {
			format = "yyyy-MM-dd HH:mm:ss";
		}
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		return sdf.format(new Date());
	}


	/**
	 * 将日期时间转化为字符串
	 *
	 * @return
	 */
	public static String covertDate(Date date,String format) {
		if (format == null || format.isEmpty()) {
			format = "yyyy-MM-dd HH:mm:ss";
		}
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		return sdf.format(date);
	}


	/**
	 * 日期格式字符串转换成时间戳
	 *
	 * @param dateStr
	 * @param format
	 * @return
	 */
	public static Date convertStringInDate(String dateStr, String format) {
		if (format == null || format.isEmpty()) {
			format = "yyyy-MM-dd HH:mm:ss";
		}
		try {
			SimpleDateFormat sdf = new SimpleDateFormat(format);
			return sdf.parse(dateStr);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

//	public static void main(String[] args) {
//		String timeStamp = getCurrentTimeStamp();
//		// 运行输出:timeStamp=1470278082
//		System.out.println("timeStamp=" + timeStamp);
//		// 运行输出:1470278082980
//		System.out.println(System.currentTimeMillis());
//		// 该方法的作用是返回当前的计算机时间，时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数
//		String date = timeStamp2Date(timeStamp, "yyyy-MM-dd HH:mm:ss");
//		// 运行输出:date=2016-08-04 10:34:42
//		System.out.println("date=" + date);
//		// 运行输出:date=2016-08-04 10:34
//		System.out.println("date.substring=" + date.substring(0, 16));
//		String timeStamp2 = date2TimeStamp(date, "yyyy-MM-dd HH:mm:ss");
//		// 运行输出:1470278082
//		System.out.println(timeStamp2);
//	}

	/**
	 * 取得当前日历年份
	 * 
	 * @return
	 */
	public static int getCurrentYear() {
		// 使用默认时区和语言环境
		return Calendar.getInstance().get(Calendar.YEAR);
	}

	/**
	 * 取得当前日历月份
	 * 
	 * @return
	 */
	public static int getCurrentMonth() {
		// 使用默认时区和语言环境//第一个月从0开始，所以得到月份＋1
		return Calendar.getInstance().get(Calendar.MONTH) + 1;
	}

	/**
	 * @desc 判断2个时间是否跨月
	 **/
	public static boolean checkOverMonth(Date beginDate, Date endDate) {
		Calendar begin = Calendar.getInstance();
		begin.setTime(beginDate);
		Calendar end = Calendar.getInstance();
		end.setTime(endDate);
		if (begin.get(Calendar.YEAR) == end.get(Calendar.YEAR) && begin.get(Calendar.MONTH) == end.get(Calendar.MONTH)) {
			return false;
		}
		return true;
	}

	/**
	 * 将yyyy年mm月dd日转化为yyyy-mm-dd
	 *
	 * @param date
	 * @return
	 * @throws ParseException
	 */
	public static String convertDate(String date) throws ParseException {
		SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy年MM月dd日");
		Date convertDate=simpleDateFormat.parse(date);
		SimpleDateFormat simpleDateFormatTwo=new SimpleDateFormat("yyyy-MM-dd");
		return simpleDateFormatTwo.format(convertDate);
	}

	/**
	 * 根据日期获取当前月时间
	 * @param date
	 * @return
	 */
	public static List<String> getMonthByDate(String date){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date nowday = null;
		try {
			nowday = sdf.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		Date monthStart = getMonthStart(nowday);
		Date monthEnd = getMonthEnd(nowday);
		List<String> list =new ArrayList();
		while (!monthStart.after(monthEnd)) {
			list.add(sdf.format(monthStart));
			monthStart = getNext(monthStart);
		}
		return list;
	}

	/**
	 * 根据日期获取月初
	 * @param date
	 * @return
	 */
	public static Date getMonthStart(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		int index = calendar.get(Calendar.DAY_OF_MONTH);
		calendar.add(Calendar.DATE, (1 - index));
		return calendar.getTime();
	}

	/**
	 * 根据日期获取月末
	 * @param date
	 * @return
	 */
	public static Date getMonthEnd(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.MONTH, 1);
		int index = calendar.get(Calendar.DAY_OF_MONTH);
		calendar.add(Calendar.DATE, (-index));
		return calendar.getTime();
	}

	/**
	 * 根据日期获取下一天
	 * @param date
	 * @return
	 */
	public static Date getNext(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.DATE, 1);
		return calendar.getTime();
	}

	/**
	 * 根据日期获取本周日期
	 * @param date
	 * @return
	 * @throws ParseException
	 */
	public static List<String> getWeekByDate(String date) {
		Calendar cal = Calendar.getInstance();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date nowtime= null;
		try {
			nowtime = sdf.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		cal.setTime(nowtime);
		// 设置一个星期的第一天，按中国的习惯一个星期的第一天是星期一
		cal.setFirstDayOfWeek(Calendar.MONDAY);
		// 获得当前日期是一个星期的第几天
		int dayWeek = cal.get(Calendar.DAY_OF_WEEK);
		if(dayWeek==1){
			dayWeek = 8;
		}
		// 根据日历的规则，给当前日期减去星期几与一个星期第一天的差值
		cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - dayWeek);
		Date mondayDate = cal.getTime();

		cal.add(Calendar.DATE, 4 +cal.getFirstDayOfWeek());
		Date sundayDate = cal.getTime();
		List lDate = new ArrayList();
		lDate.add(sdf.format(mondayDate));
		Calendar calBegin = Calendar.getInstance();
		// 使用给定的 Date 设置此 Calendar 的时间
		calBegin.setTime(mondayDate);
		Calendar calEnd = Calendar.getInstance();
		// 使用给定的 Date 设置此 Calendar 的时间
		calEnd.setTime(sundayDate);
		//测试此日期是否在指定日期之后
		while (sundayDate.after(calBegin.getTime())) {
			// 根据日历的规则，为给定的日历字段添加或减去指定的时间量
			calBegin.add(Calendar.DAY_OF_MONTH, 1);
			Date time = calBegin.getTime();
			String format = sdf.format(time);
			lDate.add(format);
		}
		return lDate;
	}
}
